package personal.parser;

public interface ParserTable {


    /**
     * 动作
     */
    class Action {
        private final Integer id;

        public int getId() {
            return id;
        }

        protected Action(int id) {
            this.id = id;
        }

        @Override
        public int hashCode() {
            return id.hashCode();
        }

        @Override
        public boolean equals(Object obj) {
            if (this.getClass() != obj.getClass()) return false;
            return this.id.equals(((Action) obj).id);
        }
    }


    /**
     * 移入
     */
    class ShiftAction extends Action {
        public ShiftAction(int id) {
            super(id);
        }

        @Override
        public String toString() {
            return String.format("Shift %d", this.getId());
        }
    }

    /**
     * 归约
     */
    class ReduceAction extends Action {
        public ReduceAction(int id) {
            super(id);
        }

        @Override
        public String toString() {
            return String.format("Reduce %d", this.getId());
        }
    }

    /**
     * 接受
     */
    class AcceptAction extends Action {
        public AcceptAction() {
            super(-1);
        }

        @Override
        public String toString() {
            return "Accept";
        }
    }

    /**
     * @return 状态数量
     */
    int size();

    /**
     * @return 转移表对应的文法
     */
    Grammar getGrammar();

    /**
     * @return 转移表对应的自动机
     */
    ParserFA getParserFA();

    /**
     * 查询 action 表
     *
     * @param status   状态
     * @param terminal 终结符
     * @return action 表对应位置的内容
     */
    Action getAction(int status, Grammar.Terminal terminal);

    /**
     * 查询 goto 表
     *
     * @param status      状态
     * @param nonTerminal 非终结符
     * @return goto 表对应位置的内容
     */
    int getGoto(int status, Grammar.NonTerminal nonTerminal);
}
